import time
from time import sleep

from selenium.webdriver import Keys, ActionChains
from selenium.webdriver.support.wait import WebDriverWait
from automatic import page
from automatic.base.get_logger import GetLogger


# 获取log日志器
log = GetLogger().get_logger()


class Base:
    def __init__(self, driver):
        log.info("[base]：正在获取初始化driver对象:{}".format(driver))
        self.driver = driver

    # 查找元素方法 封装
    def base_find(self, loc, timeout=30, poll_frequency=0.5):
        log.info("[base]：正在定位{}元素，默认定位超时时间为：{}".format(loc, timeout))
        # 使用显示等待 查找元素
        return WebDriverWait(self.driver,
                             timeout=timeout,
                             poll_frequency=poll_frequency).until(lambda x: x.find_element(*loc))

    # 点击元素方法 封装
    def base_click(self, loc):
        log.info("[base]：正在对{}元素执行点击事件".format(loc))
        self.base_find(loc).click()

    # 输入元素方法 封装
    def base_input(self, loc, value):
        log.info("[base]:正在获取{}元素".format(loc))
        # 获取元素
        el = self.base_find(loc)
        log.info("[base]:正在对{}元素执行清空操作".format(loc))
        # 输入前 清空
        # el.clear()
        el.send_keys(Keys.CONTROL+"a")
        el.send_keys(Keys.DELETE)
        log.info("[base]:正在对{}元素输入内容：{}".format(loc, value))
        # 输入
        el.send_keys(value)

    # 获取文本信息方法 封装
    def base_get_text(self, loc):
        log.info("[base]:正在获取{}元素文本值".format(loc))
        return self.base_find(loc).text

    # 截图方法 封装
    def base_get_img(self):
        log.info("[base]:断言出错，调用截图")
        self.driver.get_screenshot_as_file("../image/{}.png".format(time.strftime("%Y_%m_%d %H_%M_%S")))

    # 判断元素是否存在方法 封装
    def base_element_is_exist(self, loc):
        try:
            self.base_find(loc, timeout=2)
            log.info("[base]:{}元素查找成功，存在页面".format(loc))
            return True  # 代表元素存在
        except:
            log.info("[base]:{}元素查找失败，不存在当前页面".format(loc))
            return False  # 代表元素不存在

    #悬停操作 封装
    def base_move_to_element(self,loc):
        log.info("[base]:正在对{}元素进行悬停操作".format(loc))
        el=self.base_find(loc)
        actions=ActionChains(self.driver)
        actions.move_to_element(el).perform()
        time.sleep(2)

    #保存原窗口句柄
    def base_save_original_window(self):
        log.info("[base]:正在保存当前窗口句柄")
        return self.driver.current_window_handle

    #切换到新窗口 封装
    def base_switch_to_window(self):
        #记录所有窗口的句柄
        all_windows=self.driver.window_handles
        log.info("[base]:正在切换窗口")
        self.driver.switch_to.window(all_windows[-1])

    #切换到原窗口
    def base_switch_to_original_window(self,original_window):
        log.info("[base]:正在切换回原窗口")
        self.driver.switch_to.window(original_window)
